package com.danceforyou.common.service;

import com.danceforyou.common.model.BaseDO;
import com.danceforyou.common.dao.BaseDAO;
import com.danceforyou.common.model.view.BizData4Page;
import com.danceforyou.common.vo.SqlOrderEnum;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 类名称：BaseService
 * 创建人：danceforyou
 * 创建时间：2020年10月23日
 * 版本号：1.0v
 */
public interface BaseService<T, DO extends BaseDO<T>, VO extends DO, DAO extends BaseDAO<T, DO, VO>> {
    /**
     * 获取Dao
     * @return DAO
     */
    DAO getDao();

    /**
     * 新增数据
     * @param entity 实体类
     * @return int
     */
    int insert(DO entity);

    /**
     * 更新数据（不更新为null的列）
     * @param entity 实体类
     * @return int
     */
    int update(DO entity);

    /**
     * 全列更新
     * @param entity 实体类
     * @return int
     */
    int updateWhole(DO entity);

    /**
     * 根据指定字段更新数据（不更新为null的列）
     * @param entity 实体类
     * @return int
     */
    int updateByProperty(DO entity, String property, Object value);

    /**
     * 根据指定字段全列更新
     * @param entity 实体类
     * @return int
     */
    int updateWholeByProperty(DO entity, String property, Object value);

    /**
     * 删除数据
     * @param entity 实体类
     * @return int
     */
    int delete(DO entity);

    /**
     * 根据主键单条删除
     * @param id 主键值
     * @return int
     */
    int deleteById(Object id);

    /**
     * 根据主键批量删除
     * @param idList 主键List
     * @return int
     */
    int deleteByIds(List<T> idList);

    /**
     * 根据指定字段删除
     * @param property 字段名称
     * @param value 字段值
     * @return int
     */
    int deleteByProperty(String property, Object value);

    /**
     * 根据条件批量删除
     * @param condition 条件
     * @return int
     */
    int deleteByCondition(Map<String, Object> condition);

    /**
     * 标记为删除
     * @param entity 实体类
     * @return int
     */
    int setDelete(DO entity);

    /**
     * 根据主键单条标记为删除
     * @param id 主键值
     * @return int
     */
    int setDeleteById(T id);

    /**
     * 根据主键批量标记为删除
     * @param idList 主键List
     * @return int
     */
    int setDeleteByIds(List<T> idList);

    /**
     * 根据指定字段标记为删除
     * @param property 字段名称
     * @param value 字段值
     * @return int
     */
    int setDeleteByProperty(String property, Object value);

    /**
     * 根据条件批量标记为删除
     * @param condition 条件
     * @return int
     */
    int setDeleteByCondition(Map<String, Object> condition);

    /**
     * 根据主键获取数据
     * @param id 主键值
     * @return DO
     */
    DO getById(T id);

    /**
     * 根据指定字段获取数据（无排序）
     * @param property 字段名称
     * @param value 字段值
     * @return DO
     */
    DO getByProperty(String property, Object value);

    /**
     * 根据指定字段获取数据（按条件排序）
     * @param property 字段名称
     * @param value 字段值
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return DO
     */
    DO getByProperty(String property, Object value, String orderBy, SqlOrderEnum sortBy);

    /**
     * 根据条件获取数据（无排序）
     * @param condition 条件
     * @return List<DO>
     */
    DO getByCondition(Map<String, Object> condition);

    /**
     * 根据条件获取数据（按条件排序）
     * @param condition 条件
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<DO>
     */
    DO getByCondition(Map<String, Object> condition, String orderBy, SqlOrderEnum sortBy);

    /**
     * 获取所有数据列表（无排序）
     * @return List<DO>
     */
    List<DO> listAll();

    /**
     * 获取所有数据列表（按条件排序）
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<DO>
     */
    List<DO> listAll(String orderBy, SqlOrderEnum sortBy);

    /**
     * 根据指定字段获取数据列表（无排序）
     * @param property 字段名称
     * @param value 字段值
     * @return List<DO>
     */
    List<DO> listByProperty(String property, Object value);

    /**
     * 根据指定字段获取数据列表（按条件排序）
     * @param property 字段名称
     * @param value 字段值
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<DO>
     */
    List<DO> listByProperty(String property, Object value, String orderBy, SqlOrderEnum sortBy);

    /**
     * 根据条件获取数据列表（无排序）
     * @param condition 条件
     * @return List<DO>
     */
    List<DO> listByCondition(Map<String, Object> condition);

    /**
     * 根据条件获取数据列表（按条件排序）
     * @param condition 条件
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<DO>
     */
    List<DO> listByCondition(Map<String, Object> condition, String orderBy, SqlOrderEnum sortBy);

    /**
     * 分页查询数据列表
     * @param condition 条件
     * @return List<Map>
     */
    List<VO> queryList(Map<String, Object> condition);

    /**
     * 分页查询数据列表
     * @param condition 条件
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<Map>
     */
    List<VO> queryList(Map<String, Object> condition, String orderBy, SqlOrderEnum sortBy);

    /**
     * 分页查询数据列表
     * @param condition 条件
     * @param offset 起始条目序号
     * @param rows 获取条目数
     * @param orderBy 排序字段
     * @param sortBy 排序方式
     * @return List<Map>
     */
    List<VO> queryPage(Map<String, Object> condition, int offset, int rows, String orderBy, SqlOrderEnum sortBy);

    /**
     * 根据条件查询总条数
     * @param condition 条件
     * @return Integer
     */
    Integer countByCondition(Map<String, Object> condition);

    /**
     * 根据条件统计数据
     * @param condition 条件
     * @return Map<String, Object>
     */
    Map<String, Object> statsByCondition(Map<String, Object> condition);

    /**
     * 根据条件求和
     * @param property 求和的字段
     * @param condition 条件
     * @return BigDecimal
     */
    BigDecimal sumByCondition(String property, Map<String, Object> condition);

    /**
     * 保存或更新数据
     * @param entity 实体类
     */
    void saveOrUpdate(DO entity);

    /**
     * 分页查询数据
     * @param bizData4Page 分页数据
     */
    void queryPageByDataPerm(BizData4Page<VO> bizData4Page);
}
